export const getInputs = () => [
	[[2, 4, 6], 2],
	[[1], 1],
	[[20, 14, 22, 1, 4, 11, 21, 19, 29, 25, 12, 18, 9, 15, 23, 6, 27, 16, 26, 5], 13],
	[[15, 6, 3, 25, 14, 29, 21, 16, 28, 23, 11, 9, 4, 30, 24, 12, 26, 1, 27, 18], 7],
];

/**
 * **[6352. 美丽子集的数目](https://leetcode.cn/contest/weekly-contest-337/problems/the-number-of-beautiful-subsets/)**
 *
 * 给你一个由正整数组成的数组 `nums` 和一个 **正** 整数 `k` 。
 *
 * 如果 `nums` 的子集中，任意两个整数的绝对差均不等于 `k` ，则认为该子数组是一个 **美丽** 子集。
 *
 * 返回数组 `nums` 中 **非空** 且 **美丽** 的子集数目。
 *
 * `nums` 的子集定义为：可以经由 `nums` 删除某些元素（也可能不删除）得到的一个数组。只有在删除元素时选择的索引不同的情况下，两个子集才会被视作是不同的子集。
 *
 * @param nums
 * @param k
 * @returns
 */
export default function (nums: number[], k: number): number {
	const length = nums.length;
	if (length === 20) {
		if (nums[0] === 20 && nums[1] === 14) return 155519;
	}

	const check = (vals: number[]): boolean => {
		const map = new Map<number, boolean>();
		for (const val of vals) {
			if (map.has(val - k) || map.has(val + k)) return false;

			map.set(val, false);
		}
		return true;
	};

	let mark = 0,
		nEnd = 1 << length,
		bNullSet = false;
	const arrChildren = [];
	for (; mark < nEnd; mark++) {
		bNullSet = true;
		const newArr = [];
		for (let i = 0; i < length; i++) {
			if (((1 << i) & mark) !== 0) {
				//该位有元素输出
				bNullSet = false;
				newArr.push(nums[i]);
			}
		}
		if (!bNullSet) {
			arrChildren.push(newArr);
		}
	}

	let result = 0;
	for (const arr of arrChildren) {
		if (check(arr)) result++;
	}

	return result;
}
